#include "func.h"
#include "handleCommand.h"
#ifndef __TIMINGWHEEL_H__
#define __TIMINGWHEEL_H__


//----------数据结构一 --------
//链表中的元素 
typedef struct setNode_s{
    int netfd;
    struct setNode_s* next;
}setNode_t; 
//一个链表用来维护每个时刻要被踢的对象 
typedef struct set_s{
    setNode_t* Head;
}set_t; 

//----------数据结构二 --------
//一个循环队列(用于模拟计时),队列中的元素为指向链表地址的指针(找到被踢的集合)
typedef struct loopQueue_s{
    set_t** Queue;  //元素为set_t*类型的数组
    int queueSize;
}loopQueue_t;

//---------------------------------------------
//方便参数传递
typedef struct timeoutShare_s{
    loopQueue_t loopQueue;
    int fdToIdx[1024]; //用于有netfd查找所在队列的下标
    int Idx; //要踢出的集合在队列中的下标
}timeoutShare_t;

//取出链表的第一个元素,并将该元素从链表删除
int deSet(set_t* pset,int* netfd);
//将netfd加入集合
int enSet(set_t *pset,int netfd);
//将netfd从集合中删除
int deNetfd(set_t* pset,int netfd);

//初始化队列
int loopQueueInit(loopQueue_t* pQueue,int queueSize);
//销毁队列
int loopQueueDestory(loopQueue_t* pQueue);
//找出当前踢出链接的链表
int findSet(const loopQueue_t* pQueue,int idx,set_t* pset);

//设置当前要处理的集合所在队列中的位置
int setTimeoutIdx(timeoutShare_t* pTimeoutShare,int idx);
//初始化timeoutShare_t
int timeoutShareInit(timeoutShare_t* pTimeoutShare,int queueSize);
//-----------------timeoutShare_t的核心操作 ---------
//1.清空队列中指定下标集合
int emptySet(timeoutShare_t* pTimeoutShare,cmdShare_t* netfdToPcmd[],int idx);
//2.将netfd加入集合
int joinSet(timeoutShare_t* pTimeoutShare,int netfd);
//3.从集合中删除指定的netfd
int delNetfd(timeoutShare_t* pTimeoutShare,int netfd);



#endif
